package {
  import com.axon.mvc.helpers.AxVerbs;
  import com.axon.mvc.patterns.facade.AxFacade;

  import controllers.*;

  import flash.display.DisplayObject;

  import helpers.ModelsManager;
  import helpers.Verbs;

  import models.proxies.AnaliseProxy;
  import models.proxies.AtividadeProxy;
  import models.proxies.DocumentoApresentadoProxy;
  import models.proxies.ExigenciaProxy;
  import models.proxies.FotoProxy;
  import models.proxies.PleitoProxy;
  import models.proxies.ProdutoProxy;
  import models.proxies.ProdutoServicoProxy;
  import models.proxies.SessionProxy;
  import models.proxies.UserProxy;
  import models.proxies.VistoriaProxy;
  import models.vo.*;

  import mx.core.Application;

  import views.mediators.LoungeMediator;
  import views.mediators.PleitoListaAnaliseMediator;
  import views.mediators.PleitoListaAprovadosMediator;
  import views.mediators.PleitoListaArquivadosMediator;
  import views.mediators.PleitoListaCertificacaoMediator;
  import views.mediators.PleitoListaConsultaMediator;
  import views.mediators.PleitoListaDeliberacaoMediator;
  import views.mediators.PleitoListaDistribuicaoMediator;
  import views.mediators.PleitoListaRecomendacaoMediator;
  import views.mediators.PleitoListaRejeitadosMediator;
  import views.mediators.PleitoListaTriagemMediator;

  public class AppFacade extends AxFacade {

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public static function getInstance():AppFacade {
      // -------------------------------------------- //
      //  Precisamos referenciar todos os Commands    //
      //  para que a função getDefinitionByName       //
      //  não dê um ReferenceError                    //
      // -------------------------------------------- //

      AppCommand;
      UserCommand;
      PleitoCommand;
      AnaliseCommand;
      VistoriaCommand;
      FotoCommand;
      ExigenciaCommand;
      AtividadeCommand;
      ProdutoCommand;
      ProdutoServicoCommand;
      DocumentoApresentadoCommand;

      // -------------------------------------------- //

      if (instance == null)
        instance = new AppFacade();

      return instance as AppFacade;
    }

    [Bindable]
    public var nomeInstituicao:String = "Sudene";

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    override protected function initialize():void {

      regAppCommandActions([AxVerbs.STARTUP, AxVerbs.LOGIN_POPUP, AxVerbs.LOGIN, AxVerbs.LOGOUT]);

      regModelCommandActions(User, [Verbs.LIST_ANALISTAS]);

      regModelCommandActions(Pleito, [AxVerbs.LIST, AxVerbs.INVALIDATE_LIST,

        AxVerbs.READ_POPUP, AxVerbs.READ,

        AxVerbs.GENERATE_REPORT,

        Verbs.REGISTRAR_PROTOCOLO_POPUP, Verbs.REGISTRAR_PROTOCOLO,

        Verbs.REGISTRAR_DOCTOS_POPUP, Verbs.REGISTRAR_DOCTOS_ADIC,

        Verbs.EDITAR_DOCTO_POPUP, Verbs.EDITAR_DOCTO,

        Verbs.ACEITAR_INSCRICAO_POPUP, Verbs.ACEITAR_INSCRICAO,

        Verbs.REJEITAR_INSCRICAO_POPUP, Verbs.REJEITAR_INSCRICAO,

        Verbs.DISTRIBUIR_POPUP, Verbs.DISTRIBUIR,

        Verbs.ANALISAR_POPUP,

        Verbs.AVANCAR_POPUP, Verbs.AVANCAR,

        Verbs.VOLTAR_PARA_ANALISE_POPUP, Verbs.VOLTAR_PARA_ANALISE,

        Verbs.ARQUIVAR_POPUP, Verbs.ARQUIVAR,

        Verbs.EDITAR_DATA_LAUDO_POPUP, Verbs.EDITAR_DATA_LAUDO
        ]);

      regModelCommandActions(Analise, [Verbs.REGISTRAR_ANALISE]);

      regModelCommandActions(Vistoria, [Verbs.REGISTRAR_ANALISE]);

      regModelCommandActions(Foto, [AxVerbs.LIST, AxVerbs.READ_POPUP, AxVerbs.NEW_POPUP, AxVerbs.EDIT_POPUP, AxVerbs.SAVE, AxVerbs.DELETE]);

      regModelCommandActions(Exigencia, [AxVerbs.NEW, AxVerbs.SAVE, AxVerbs.DELETE]);

      regModelCommandActions(Atividade, [Verbs.REGISTRAR_ANALISE]);

      regModelCommandActions(Produto, [Verbs.REGISTRAR_ANALISE]);

      regModelCommandActions(ProdutoServico, [Verbs.REGISTRAR_ANALISE]);

      regModelCommandActions(DocumentoApresentado, [AxVerbs.LIST, AxVerbs.EDIT, AxVerbs.SAVE]);

    }

    override public function startup(app:DisplayObject):void {
      modelsArray = [Acionista, Analise, Area, AreaMunicipio, Atividade, Beneficio, ComponenteEmpreendimento, Contato, Documento, DocumentoApresentado, DocumentoIncentivo, Empreendimento, Estado, Exigencia, Foto, Incentivo, IncentivoPrecondicao, InformacaoUsuario, Municipio, PessoaJuridica, Pleito, Precondicao, Producao, Produto, ProdutoServico, Mercadoria, Depreciavel, DocumentoFiscal, Investimento, Deposito, OpcaoDipj, Caracterizacao, SetorEconomico, TipoPrecondicao, Tramitacao, UnidadeMedida, User, Vistoria];
      super.startup(app);
      this.nomeInstituicao = Application.application.parameters.org;

    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get app():Pleitos {
      return Application.application as Pleitos
    };

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    [Bindable]
    public function get models():ModelsManager {
      return ModelsManager.instance
    };

    public function set models(value:ModelsManager):void {

    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get sessionProxy():SessionProxy {
      return getProxy(SessionProxy) as SessionProxy
    }

    public function get userProxy():UserProxy {
      return getProxy(UserProxy) as UserProxy
    }

    public function get pleitoProxy():PleitoProxy {
      return getProxy(PleitoProxy) as PleitoProxy
    }

    public function get analiseProxy():AnaliseProxy {
      return getProxy(AnaliseProxy) as AnaliseProxy
    }

    public function get vistoriaProxy():VistoriaProxy {
      return getProxy(VistoriaProxy) as VistoriaProxy
    }

    public function get fotoProxy():FotoProxy {
      return getProxy(FotoProxy) as FotoProxy
    }

    public function get exigenciaProxy():ExigenciaProxy {
      return getProxy(ExigenciaProxy) as ExigenciaProxy
    }

    public function get atividadeProxy():AtividadeProxy {
      return getProxy(AtividadeProxy) as AtividadeProxy
    }

    public function get produtoProxy():ProdutoProxy {
      return getProxy(ProdutoProxy) as ProdutoProxy
    }

    public function get produtoServicoProxy():ProdutoServicoProxy {
      return getProxy(ProdutoServicoProxy) as ProdutoServicoProxy
    }

    public function get documentoApresentadoProxy():DocumentoApresentadoProxy {
      return getProxy(DocumentoApresentadoProxy) as DocumentoApresentadoProxy
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get loungeMediator():LoungeMediator {
      return getMediator(LoungeMediator) as LoungeMediator
    }

    public function get pleitoListaTriagemMediator():PleitoListaTriagemMediator {
      return getMediator(PleitoListaTriagemMediator) as PleitoListaTriagemMediator
    }

    public function get pleitoListaDistribuicaoMediator():PleitoListaDistribuicaoMediator {
      return getMediator(PleitoListaDistribuicaoMediator) as PleitoListaDistribuicaoMediator
    }

    public function get pleitoListaAnaliseMediator():PleitoListaAnaliseMediator {
      return getMediator(PleitoListaAnaliseMediator) as PleitoListaAnaliseMediator
    }

    public function get pleitoListaCertificacaoMediator():PleitoListaCertificacaoMediator {
      return getMediator(PleitoListaCertificacaoMediator) as PleitoListaCertificacaoMediator
    }

    public function get pleitoListaRecomendacaoMediator():PleitoListaRecomendacaoMediator {
      return getMediator(PleitoListaRecomendacaoMediator) as PleitoListaRecomendacaoMediator
    }

    public function get pleitoListaDeliberacaoMediator():PleitoListaDeliberacaoMediator {
      return getMediator(PleitoListaDeliberacaoMediator) as PleitoListaDeliberacaoMediator
    }

    public function get pleitoListaAprovadosMediator():PleitoListaAprovadosMediator {
      return getMediator(PleitoListaAprovadosMediator) as PleitoListaAprovadosMediator
    }

    public function get pleitoListaArquivadosMediator():PleitoListaArquivadosMediator {
      return getMediator(PleitoListaArquivadosMediator) as PleitoListaArquivadosMediator
    }

    public function get pleitoListaRejeitadosMediator():PleitoListaRejeitadosMediator {
      return getMediator(PleitoListaRejeitadosMediator) as PleitoListaRejeitadosMediator
    }

    public function get pleitoListaConsultaMediator():PleitoListaConsultaMediator {
      return getMediator(PleitoListaConsultaMediator) as PleitoListaConsultaMediator
    }

  }
}